#include "ResolverdorDeConsultas.h"
#include <stdio.h>
#include <math.h>
#include "DocumentosRecuperados.h"

ResolverdorDeConsultas::ResolverdorDeConsultas(const std::string &path_lexico, const std::string &path_punteros,
		const std::string &path_info_doc, const std::string &path_tabla) {
	this->path_info_doc = path_info_doc;
	this->path_tabla = path_tabla;
	this->path_punteros = path_punteros;
	this->path_lexico = path_lexico;
	this->tabla = 0;
}

ResolverdorDeConsultas::~ResolverdorDeConsultas() {
	if (this->tabla) {
		delete this->tabla;
	}
}

void ResolverdorDeConsultas::consultar(std::string consulta) {
	FILE* info_doc = fopen(this->path_info_doc.c_str(), "r");
	this->tabla = new TablaIndice(this->path_tabla, this->path_lexico, this->path_punteros);
	//this->tabla->buscar(consulta);
}

int* ResolverdorDeConsultas::consultar(std::list<std::string> terminos_consulta, int* cantidad_devueltos) {
	FILE* info_doc = fopen(this->path_info_doc.c_str(), "r");
	int* normas = 0;
	fseek(info_doc, 0L, SEEK_END );
	int final = ftell(info_doc);
	fseek(info_doc,0L, SEEK_SET);
	normas = new int[final/sizeof(int)];
	fread(normas,final,sizeof(char),info_doc);
	fclose(info_doc);


	DocumentosRecuperados docs;
	docs.set_cantidad_terminos_consulta(terminos_consulta.size());
	vector_consulta* consulta = new vector_consulta;

	consulta->cantidad_palabras = terminos_consulta.size();
	consulta->valores = new float[consulta->cantidad_palabras];
	consulta->norma = sqrtf(consulta->cantidad_palabras);
	consulta->cant_doc_termino = new int[consulta->cantidad_palabras];
	consulta->encontrado = new bool[consulta->cantidad_palabras];

	std::list<std::string>::iterator it = terminos_consulta.begin();
	int pos_termino = 0;
	this->tabla = new TablaIndice(this->path_tabla, this->path_lexico, this->path_punteros);
	while (it != terminos_consulta.end()) {
		this->tabla->buscar((*it),&docs, pos_termino, consulta);
		pos_termino++;
		it++;
	}
	docs.set_cant_total_docs(normas[1]);
	docs.cargar_norma(normas);
	docs.rankear_docs(consulta);
	delete[] normas;
	delete[] consulta->valores;
	delete[] consulta->cant_doc_termino;
	delete[] consulta->encontrado;
	delete consulta;
	return docs.pedir_relevantes(CANTIDAD_RESULTADOS, cantidad_devueltos);
}
